<?php

/** 
 * Summary
 * 
 * Cache del sistema, puede ser conectado a varios frontends independientes 
 * este patrón de programación es conocido como Bridge-Adapter.
 */

namespace SubMemory\Cache;

use SubMemory\Cache\CacheInterface;

/**
 * Descripcion de Cache
 * 
 * Cache permite obtener,agregar y modificar datos sobre un sistema de cache
 * externo, así como: Memcache, MemcacheD, APC, o sobre un RAMDisk usando el sistama
 * de archivos con FileCache. Esta ideado bajo la metafora del zócalo, donde la clase puede 
 * ser usada por otras clases y conectarse a distintos conectores (o Backends) en forma 
 * transparente para estas.
 * 
 * Cada conector (Backend) es implementado usando la misma interfaz CacheInterface,
 * de esta forma se mantiene la compatibilidad del conector con el zócalo.
 * 
 * Puede usarse la clase Cache en varios puntos del codigo pero con distintos conectores
 * si el caso lo amerita.
 * 
 * Este patrón de programación es conocido como Bridge-Adapter. Una clase Bridge
 * hace llamadas a un Adapter pasado por su constructor, de esta forma ambas clases
 * pueden ser modificadas de forma independiente. Los Adapters pueden escribirse para
 * muchos tipos de backends.
 *  
 */

class Cache 
{
    
    /**
     * Backend 
     * @var CacheInterface 
     */
    protected $_cacheBackend;
    
    /**
     * Constructor
     */
    public function __construct(CacheInterface $cacheBackend)
    {
        $this->_cacheBackend = $cacheBackend;
    }
    
    /**
     * Destructor
     */
    public function __destruct() {
        if(method_exists($this->_cacheBackend,'__destruct')){
            $this->_cacheBackend->__destruct();
        }
        
    }
   
     /**
      * Establecer
      * 
      * La funcion Set añade/modifica un nuevo ítem asociado a una nueva clave 
      * sobre el sistema conectado.
      *  
      * @param string $key
      * @param string $data
      * @param string $expirationtime
      * @return \Previsora\AuthPrv\Cache\Cache
      */
     public function set($key, $data, $expirationtime=0)
     {
         return $this->_cacheBackend->set($key, $data, $expirationtime);
         
     }
     
    
     /**
      * Obtener 
      * 
      * La funcion get() obtiene un ítem del sistema conectado.
      * @param string $key
      * @return string
      */
     public function get($key)
     {
         return $this->_cacheBackend->get($key);
     }
     
    
     /**
      * Eliminar
      * 
      * La function delete() elimina un ítem del ssitema conectado (backend)
      * @param string $key
      * @return boolean
      */
     public function delete($key)
     {
         return $this->_cacheBackend->delete($key);
     }  
     /**
      * Cerrar conección 
      * @return boolean
      */
     public function close(){
         return $this->_cacheBackend->close();
     }
     /**
      * Recolector de basura.
      * @param int $maxlifetime
      * @return boolean
      */
     public function gc($maxlifetime){
        return $this->_cacheBackend->gc($maxlifetime); 
     }
}

